/**
 * 位图动作类，对于序列图的动画，类似于MovieClip类，但是可以设置不同的动作
 * @author zzhanglin
 * @param bitmapData
 * @param row 有多少行
 * @param col 有多少列
 * @param actions 所有的动作
 * @param frameRate 帧率，默认为3
 * @param playMode 播放模式，默认为1，即顺序播放
 * @returns {Animation}
 */
Animation = function(bitmapData,row , col , actions, frameRate , playMode)
{
	Bitmap.call(this,bitmapData); //调用父类构造
	this.className="Animation";
	if(!bitmapData) return ;
	
	this.setBitmapData(bitmapData);
	this.rate = frameRate?frameRate:3 ; //播放速率
	this.playMode = playMode?playMode:1  ; //播放模式
	
	this._row = row ;
	this._col = col ;
	this._actions = actions ;
	this._currentFrame = 0  ; //当前帧
	this._totalFrame = 0  ; //此动作的总帧
	this._cycleTime = 0  ; //循环次数
	this._currentAction = null ; //当前动作
	this._actionName ="" ; //当前的动作名称
	this._actionRectArray ; //序列图的矩形位置
	this._currentRectArray ;//当前的 rects 
	//临时变量========================
	this._tempRate =0 ;
	this._tempCycleTime = 0 ;
	this._tempCircle =1 ;
	//初始化
	this._init(); 
};
FLASH.extend(Animation ,Bitmap); //继承自Bitmap

//==============getter/setter=========================

//获取当前的动作
Animation.prototype.getCurrentAction = function(){ return this._currentAction ; };
//当前的动作名称
Animation.prototype.getCurrentActionName = function(){ return this._actionName ; };
//获取当前动作的当前的帧
Animation.prototype.getCurrentFrame = function(){ return this._currentFrame ;};
//当前动作的总帧
Animation.prototype.getTotalFrame = function(){ return this._totalFrame ;};
//获得当前的所有动作
Animation.prototype.getAction = function(){ return this._actions ;};

//===============================================

//==================公共方法==========================

//从第一帧开始播放
Animation.prototype.start =function(frame)
{
	frame = frame?frame:-1;
	if(frame>-1){
		this._currentFrame = frame ;
	}else if( this._currentFrame>this._totalFrame ){
		this._currentFrame = 0 ;
	}
	this._tempRate = 0 ; 
};
/**
 * 播放某个动作
 * @param actionName 动作名称
 */
Animation.prototype.play = function(actionName )
{
	if(this._actionName!=actionName ) //判断是否应该改变动作
	{
		this._actionName=actionName ;
		this._currentRectArray = this._actionRectArray[this._actionName] ;
		this._totalFrame = this._currentRectArray.length ;
		if( this.playMode == AnimationPlayMode.POSITIVE ) 
		{
			this.start(0);
		}else if( this.playMode == AnimationPlayMode.ANTITONE  ) {
			this.start( this._totalFrame-1);
		}else{
			this.start(0);
		}
		 this._currentRect = this._currentRectArray[this._currentFrame] ;
	}
	
	if( this.playMode == AnimationPlayMode.POSITIVE ) //正序播放
	{
		this._playPositive() ;
	}else if( this.playMode == AnimationPlayMode.ANTITONE  ) { //反序播放
		this._playAntitone();
	}else{
		this._playCirculation();  //循环反复播放
	}
};

//=================私有方法================================

/**
 * 初始化
 */
Animation.prototype._init = function()
{
	//当前图片的宽高
	this.setWidth(Math.round( this._bitmapData._width/this._col ) );
	this.setHeight(Math.round( this._bitmapData._height/this._row ) );
	//默认的位置
	this._currentRect = new Rectangle(0,0,this._width , this._height );
	
	this._actionRectArray = []; //实例化动作区域数据
	var count = 0;
	var currRow = 0 ;
	//遍历arr中的行和帧数
	for(var i = 0;i<this._actions.length ; i++){
		var name = this._actions[i].actionName ;//姿势名称
		var frameNum = this._actions[i].frameNum ;//有多少个动作
		this._actionRectArray[name] = [];
		for(var j=0;j<frameNum;j++){
			var cNum = count%this._col ;//当前为第几列，0为第一列
			var rect = new Rectangle(cNum*this._width,currRow*this._height,this._width,this._height); //一张小图片的位置
			
			//矩形位置放到数组中
			this._actionRectArray[name].push(rect); //将此小图片的位置添加到数组中
			
			//如果完了一行
			if(cNum==this._col-1){
				//将当前行设置为下一行
				currRow++;
			}
			count++;
		}
	}	
};
/**
 * 顺序播放，默认
 */
Animation.prototype._playPositive = function()
{
	if(this._tempRate==this.rate)  //判断是否应该跳到下一帧
	{
		this._currentRect = this._currentRectArray[this._currentFrame] ;
		this._tempRate = 0 ;
		this._currentFrame++;
		if(this._currentFrame>=this._totalFrame) {
			this._currentFrame =0 ; 
			this._checkCycleTime();
		}
	}
	this._tempRate++;
};
/**
 * 倒序播放
 */
Animation.prototype._playAntitone = function()
{
	if(this._tempRate==this.rate)  //判断是否应该跳到下一帧
	{
		this._currentRect = this._currentRectArray[this._currentFrame] ;
		this._tempRate = 0 ;
		this._currentFrame--;
		if(this._currentFrame<0 ) {
			this._currentFrame = this._totalFrame-1 ; 
			this._checkCycleTime();
		}
	}
	this._tempRate++;
};
/**
 * 往复播放
 */
Animation.prototype._playCirculation = function()
{
	if(this._tempRate==this.rate)  //判断是否应该跳到下一帧
	{
		this._currentRect = this._currentRectArray[this._currentFrame] ;
		this._tempRate = 0 ;
		this._currentFrame+=this._tempCircle ;
		if(this._tempCircle>0 ){
			if(this._currentFrame>=this._totalFrame) {
				this._currentFrame = this._totalFrame-2 ; 
				this._tempCircle= -1 ;
			}
		}else{
			if(this._currentFrame<0 ) {
				this._currentFrame =1 ; 
				this._tempCircle= 1 ;
			}
		}
		this._checkCycleTime();
	}
	this._tempRate++;
};
/**
 * 判断循环了几次了
 */
Animation.prototype._checkCycleTime = function()
{
	if(this._cycleTime>0)
	{
		this._tempCycleTime++;
		if(this._tempCycleTime==this._cycleTime){
			var evt = new AnimationEvent( AnimationEvent.ANIMATION_COMPLETE );
			this.dispatchEvent(  evt ) ;
			this._cycleTime =0 ;
			this._tempCycleTime =0 ;
		}
	}
};

/**
 * 释放资源
 */
Animation.prototype.dispose = function()
{
	Bitmap.prototype.dispose.call( this );
	this._actions = null ;
	this._currentRectArray= null ;//当前的 rects 
	this._actionRectArray= null ; //序列图的矩形位置
};